package com.skiving.cloud.admin.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import com.mybatisflex.core.paginate.Page;
import com.skiving.cloud.auth.util.UserUtil;
import com.skiving.cloud.common.utils.PageParameter;
import com.skiving.cloud.common.utils.ReturnT;
import com.skiving.cloud.common.utils.UuidUtil;
import com.skiving.cloud.logutils.OperateLogLocal;
import org.noear.solon.annotation.*;
import org.noear.solon.core.util.MimeType;
import com.skiving.cloud.admin.entity.SysConfig;
import com.skiving.cloud.admin.service.SysConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 系统参数配置信息表 控制层。
 *
 * @author skivingcloud
 * @since 2025-03-08
 */
@Controller
@Api("系统参数配置信息表接口")
@Mapping("/sysConfig")
@Produces(MimeType.APPLICATION_JSON_UTF8_VALUE)
public class SysConfigController {

    @Inject
    private SysConfigService sysConfigService;

    /**
     * 添加系统参数配置信息表。
     *
     * @param sysConfig 系统参数配置信息表
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @Post
    @Mapping("/save")
    @ApiOperation("保存系统参数配置信息表")
    @OperateLogLocal(module="系统管理-系统参数管理", description = "新增系统参数")
    @SaCheckPermission("sys:config:add")
    public ReturnT<Boolean> save(@Body @ApiParam("系统参数配置信息表") SysConfig sysConfig) {
        SysConfig has = sysConfigService.getConfigValueByKey(sysConfig.getParamKey());
        if(has == null){
            return ReturnT.error("参数编码重复", false);
        }
        sysConfig.setId(UuidUtil.get32UUID());
        sysConfig.setCreator(UserUtil.getCurrentUser().getId());
        sysConfig.setCreateTime(LocalDateTime.now());
        return ReturnT.ok(sysConfigService.save(sysConfig));
    }

    /**
     * 根据主键删除系统参数配置信息表。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @Get
    @Mapping("/remove/{id}")
    @ApiOperation("根据主键系统参数配置信息表")
    @OperateLogLocal(module="系统管理-系统参数管理", description = "删除系统参数")
    @SaCheckPermission("sys:config:remove")
    public ReturnT<Boolean> remove(@Path @ApiParam("系统参数配置信息表主键") String id) {
        return ReturnT.ok(sysConfigService.removeById(id));
    }

    /**
     * 根据主键更新系统参数配置信息表。
     *
     * @param sysConfig 系统参数配置信息表
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @Post
    @Mapping("/update")
    @ApiOperation("根据主键更新系统参数配置信息表")
    @OperateLogLocal(module="系统管理-系统参数管理", description = "修改系统参数")
    @SaCheckPermission("sys:config:update")
    public ReturnT<Boolean> update(@Body @ApiParam("系统参数配置信息表主键") SysConfig sysConfig) {
        sysConfig.setModUser(UserUtil.getCurrentUser().getId());
        sysConfig.setModTime(LocalDateTime.now());
        return ReturnT.ok(sysConfigService.updateById(sysConfig));
    }

    /**
     * 查询所有系统参数配置信息表。
     *
     * @return 所有数据
     */
    @Get
    @Mapping("/list")
    @ApiOperation("查询所有系统参数配置信息表")
    public ReturnT<List<SysConfig>> list() {
        return ReturnT.ok(sysConfigService.list());
    }

    /**
     * 根据系统参数配置信息表主键获取详细信息。
     *
     * @param id 系统参数配置信息表主键
     * @return 系统参数配置信息表详情
     */
    @Get
    @Mapping("/getInfo/{id}")
    @ApiOperation("根据主键获取系统参数配置信息表")
    public ReturnT<SysConfig> getInfo(@Path @ApiParam("系统参数配置信息表主键") String id) {
        return ReturnT.ok(sysConfigService.getById(id));
    }

    /**
     * 分页查询系统参数配置信息表。
     *
     * @param parameter 分页对象
     * @return 分页对象
     */
    @Post
    @Mapping("/page")
    @ApiOperation("分页查询系统参数配置信息表")
    @SaCheckPermission("sys:config:list")
    public ReturnT<Page<SysConfig>> page(@Body @ApiParam("分页信息") PageParameter<SysConfig> parameter) {
        return ReturnT.ok(sysConfigService.queryByPage(parameter));
    }

    /**
     * 根据参数编码获取参数值
     * @param key 参数编码
     * @return 参数值
     */
    @ApiOperation("根据参数编码获取参数值")
    @Get
    @Mapping("/getConfigValueByKey/{key}")
    public ReturnT<String> getConfigValueByKey(@Path("key") String key){
        SysConfig config = sysConfigService.getConfigValueByKey(key);
        return ReturnT.ok(config.getParamValue());
    }

}
